package com.qfoud.edu.dbutils.framwork.result.impl;

import com.qfoud.edu.dbutils.framwork.exception.DbutilsException;
import com.qfoud.edu.dbutils.framwork.result.base.ResultSetHandler;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

/**
 * @author xiaobobo
 * @title: BeanHandler
 * @projectName cd-java-2303-project-parent
 * @description: TODO
 * @date 2023/5/11  10:03
 */
public class BeanHandler<T> implements ResultSetHandler<T> {

    private Class clazz;

    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }

    public T handler(ResultSet resultSet) throws Exception {
        //TODO 编写自己的处理方式...

        //遍历这个结果集
        //获取这个结果集的元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        //获取这个列的个数
        int columnCount = metaData.getColumnCount();
        //遍历每一行数据 再遍历这一行的每一列的数据
        //这个是遍历每一行
        //把游标向下移动一位

        T t=null;
        if (resultSet.next()) {
            //首先得有个Java对象
            t = (T) this.clazz.newInstance();
            //这一行中又有很多的列(读取这一行的所有列的数据)
            for (int i = 0; i < columnCount; i++) {
                String columnName = metaData.getColumnName(i + 1);
                //在读取这个列的值
                Object columnVal = resultSet.getObject(columnName);
                //再将这个key-value放到上面的T对象中去
                BeanUtils.copyProperty(t, columnName, columnVal);
            }
        }
        boolean next = resultSet.next();
        if (next) {
            throw new DbutilsException("结果集不匹配有多行数据....");
        }
        return t;
    }
}
